home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 3 / BBS in a box - Trilogy III.iso / Files / System7 tools / Frontier / Frontier SDK 2.1 / Toolkits / Applet Toolkit / appletprinting.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-11  |  5.2 KB  |  279 lines  |  [TEXT/KAHL]

  1.  
  2. /*© Copyright 1988-1992 UserLand Software, Inc.  All Rights Reserved.*/
  3.  
  4.  
  5. #include "appletinternal.h"
  6. #include "appletops.h"
  7. #include "appletquickdraw.h"
  8. #include "appletmain.h"
  9.  
  10.  
  11. static boolean flprintinit = false;
  12.  
  13.  
  14. static void printcomputewindowinfo (WindowPtr w, hdlappwindow appwindow) {
  15.     
  16.     Rect r;
  17.     
  18.     r = (*w).portRect;
  19.     
  20.     (**appwindow).windowrect = r;
  21.     
  22.     (**appwindow).contentrect = r;
  23.     
  24.     zerorect (&(**appwindow).statusrect);
  25.     
  26.     (**appwindow).windowvertpixels = r.bottom - r.top;
  27.     
  28.     (**appwindow).windowhorizpixels = r.right - r.left;
  29.     
  30.     (**appwindow).macwindow = w;
  31.     } /*printcomputewindowinfo*/
  32.     
  33.  
  34. static disposeprintinfo (void) {
  35.     
  36.     /*
  37.     2/18/92 dmb: don't clear all fields; just nil the handle.  that way, a 
  38.     hard-coded paper area can be maintained.
  39.     */
  40.     
  41.     disposehandle ((Handle) app.printinfo.printhandle);
  42.     
  43.     app.printinfo.printhandle = nil;
  44.     } /*disposeprintinfo*/
  45.  
  46.  
  47. static boolean checkprinterror (void) {
  48.     
  49.     /*
  50.     returns false if there was a print error.
  51.     */
  52.     
  53.     short x;
  54.     bigstring bserror, bs;
  55.     
  56.     x = PrError ();
  57.     
  58.     if (x == noErr) /*no error, keep going*/
  59.         return (true);
  60.     
  61.     if (x != iPrAbort) 
  62.         appalert ("\pPrinting error.");
  63.     
  64.     return (false); /*there was an error*/
  65.     } /*checkprinterror*/
  66.  
  67.  
  68. static copyprintinfo (void) {
  69.     
  70.     Rect r;
  71.     
  72.     r = app.printinfo.paperrect = (**(THPrint) app.printinfo.printhandle).prInfo.rPage;
  73.     
  74.     app.printinfo.vpagepixels = r.bottom - r.top; 
  75.     } /*copyprintinfo*/
  76.  
  77.  
  78. boolean initprint (void) {
  79.     
  80.     /*
  81.     2/18/92 dmb: set paperrect to a hard-coded default, in case the 
  82.     print manager can't be opened.  also, manage flprintinit here, instead of 
  83.     having every caller do so.
  84.     */
  85.     
  86.     Handle h;
  87.     Rect r;
  88.     
  89.     if (flprintinit) /*already initted*/
  90.         return (true);
  91.     
  92.     clearbytes (&app.printinfo, longsizeof (app.printinfo));
  93.     
  94.     SetRect (&app.printinfo.paperrect, 5, 6, 725, 546); /*defaults in case PrOpen fails*/
  95.     
  96.     if (!newclearhandle (longsizeof (TPrint), &h))
  97.         return (false);
  98.     
  99.     app.printinfo.printhandle = h; /*copy into print record*/
  100.     
  101.     PrOpen (); /*initialize the Mac print manager*/
  102.     
  103.     if (!checkprinterror ())
  104.         goto error;
  105.     
  106.     PrintDefault ((THPrint) app.printinfo.printhandle); /*set default print record*/
  107.     
  108.     PrValidate ((THPrint) app.printinfo.printhandle);
  109.     
  110.     PrClose (); /*shouldn't leave print resources open all the time*/
  111.     
  112.     if (!checkprinterror ()) 
  113.         goto error;
  114.     
  115.     copyprintinfo (); /*copies fields from handle into record*/
  116.     
  117.     flprintinit = true;
  118.     
  119.     return (true);
  120.     
  121.     error:
  122.     
  123.     disposeprintinfo ();
  124.     
  125.     return (false);
  126.     } /*initprint*/
  127.     
  128.     
  129. boolean getprintinfo (void) {
  130.     
  131.     /*
  132.     after calling this you can safely refer to fields of the 
  133.     app.printinfo record.
  134.     */
  135.     
  136.     if (!initprint ()) 
  137.         return (false);
  138.     
  139.     return (true);
  140.     } /*getprintinfo*/
  141.  
  142.  
  143. static boolean pagesetupvisit (hdlappwindow appwindow) {
  144.  
  145.     setappwindow (appwindow);
  146.     
  147.     (*app.pagesetupcallback) ();
  148.     } /*pagesetupvisit*/
  149.  
  150.  
  151. boolean pagesetup (void) {
  152.  
  153.     if (!initprint ()) 
  154.         return (false);
  155.     
  156.     PrOpen ();
  157.     
  158.     if (!checkprinterror ()) 
  159.         return (false);
  160.     
  161.     PrValidate ((THPrint) app.printinfo.printhandle);
  162.     
  163.     PrStlDialog ((THPrint) app.printinfo.printhandle);
  164.     
  165.     PrClose ();
  166.     
  167.     if (!checkprinterror ())
  168.         return (false);
  169.     
  170.     copyprintinfo (); /*copies fields from handle into record*/
  171.     
  172.     visitappwindows (&pagesetupvisit);
  173.     } /*pagesetup*/
  174.  
  175.  
  176. boolean printappwindow (hdlappwindow appwindow, boolean fldialog) {
  177.     
  178.     TPPrPort printport;
  179.     TPrStatus printstatus;
  180.     short i;
  181.     WindowPtr origmacwindow;
  182.     register boolean fl;
  183.     
  184.     if (!initprint ()) 
  185.         return (false);
  186.     
  187.     setappwindow (appwindow);
  188.     
  189.     PrOpen ();
  190.     
  191.     if (!checkprinterror ())
  192.         return (false);
  193.     
  194.     fl = false; /*until sucessful print, this is return value*/
  195.     
  196.     if (fldialog) {
  197.         
  198.         if (!PrJobDialog ((THPrint) app.printinfo.printhandle)) {
  199.             
  200.             PrClose ();
  201.             
  202.             return (false);
  203.             }
  204.             
  205.         serviceeventqueue (); /*update all dirtied windows*/
  206.         
  207.         setappwindow (appwindow); /*9/3/92 DW: app.appwindow could have changed*/
  208.         }
  209.     else
  210.         PrValidate ((THPrint) app.printinfo.printhandle);
  211.     
  212.     watchcursor ();
  213.     
  214.     copyprintinfo ();
  215.     
  216.     (**app.appwindow).flprinting = true;
  217.     
  218.     (*app.openprintcallback) (); /*fills in fields of printinfo record*/
  219.     
  220.     pushmacport (nil); /*save current port on stack*/
  221.     
  222.     printport = PrOpenDoc ((THPrint) app.printinfo.printhandle, nil, nil);
  223.     
  224.     for (i = 1; i <= app.printinfo.ctpages; i++) { /*print one page*/
  225.         
  226.         if (!serviceeventqueue ()) /*user must have selected quit or something like that*/
  227.             PrSetError (iPrAbort);
  228.             
  229.         if (PrError () != noErr)
  230.             break;
  231.         
  232.         PrOpenPage (printport, nil);
  233.         
  234.         if (PrError () == noErr) {
  235.             
  236.             origmacwindow = (**app.appwindow).macwindow;
  237.             
  238.             printcomputewindowinfo ((WindowPtr) printport, app.appwindow);
  239.             
  240.             SetFractEnable (true);
  241.             
  242.             fl = (*app.printpagecallback) (i);
  243.             
  244.             SetFractEnable (false);
  245.             
  246.             computewindowinfo (origmacwindow, app.appwindow);
  247.             }
  248.         
  249.         PrClosePage (printport);
  250.         
  251.         if (!fl)
  252.             break;
  253.         } /*for*/
  254.     
  255.     PrCloseDoc (printport);
  256.     
  257.     if (fl) {
  258.         
  259.         THPrint hp = (THPrint) app.printinfo.printhandle;
  260.         
  261.         if ((PrError () == noErr) && ((**hp).prJob.bJDocLoop == bSpoolLoop))
  262.             PrPicFile (hp, nil, nil, nil, &printstatus);
  263.         
  264.         fl = checkprinterror ();
  265.         }
  266.     
  267.     popmacport ();
  268.     
  269.     (*app.closeprintcallback) ();
  270.     
  271.     (**app.appwindow).flprinting = false;
  272.     
  273.     PrClose ();
  274.     
  275.     return (fl);
  276.     } /*printappwindow*/
  277.  
  278.  
  279.